package org.groupg.utils;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import java.awt.Color;

public class ColorPreservingConverter {

    // 获取颜色的 RGB 值（兼容 HSSF/XSSF）
    private static byte[] getRGBColor(CellStyle style, Workbook workbook) {
        // 1. 尝试获取 XSSFColor
        if (style instanceof org.apache.poi.xssf.usermodel.XSSFCellStyle) {
            XSSFColor color = ((org.apache.poi.xssf.usermodel.XSSFCellStyle) style).getFillForegroundXSSFColor();
            if (color != null && color.getRGB() != null) {
                return color.getRGB();
            }
        }

        // 2. 处理 HSSF 颜色
        if (workbook instanceof HSSFWorkbook) {
            HSSFPalette palette = ((HSSFWorkbook) workbook).getCustomPalette();
            short index = style.getFillForegroundColor();
            HSSFColor hssfColor = palette.getColor(index);
            if (hssfColor != null) {
                return new byte[] {
                    (byte) hssfColor.getTriplet()[0],
                    (byte) hssfColor.getTriplet()[1],
                    (byte) hssfColor.getTriplet()[2]
                };
            }
        }

        // 3. 默认返回黑色
        return new byte[] {0, 0, 0};
    }

    // 在目标工作簿中创建或匹配颜色
    private static short findOrCreateColor(Workbook destWorkbook, byte[] rgb) {
        // 处理 XSSF (直接使用 RGB)
        if (destWorkbook instanceof org.apache.poi.xssf.usermodel.XSSFWorkbook) {
            return (short) new XSSFColor(rgb).getIndexed();
        }

        // 处理 HSSF (在调色板中查找或创建)
        if (destWorkbook instanceof HSSFWorkbook) {
            HSSFWorkbook hssfWorkbook = (HSSFWorkbook) destWorkbook;
            HSSFPalette palette = hssfWorkbook.getCustomPalette();

            // 尝试查找现有颜色
            HSSFColor similar = palette.findSimilarColor(
                rgb[0] & 0xFF,
                rgb[1] & 0xFF,
                rgb[2] & 0xFF
            );

            if (similar != null) {
                return similar.getIndex();
            }

            // 创建新颜色（HSSF 限制为 56 色）
            try {
                return palette.addColor(
                    (byte) (rgb[0] & 0xFF),
                    (byte) (rgb[1] & 0xFF),
                    (byte) (rgb[2] & 0xFF)
                ).getIndex();
            } catch (Exception e) {
                // 调色板已满时使用最接近颜色
                return palette.findSimilarColor(
                    rgb[0] & 0xFF,
                    rgb[1] & 0xFF,
                    rgb[2] & 0xFF
                ).getIndex();
            }
        }

        return IndexedColors.BLACK.getIndex();
    }

    // 增强的样式复制方法（保留真实颜色）
    public static void copyCellStyleWithColor(Workbook src, Workbook dest, Cell srcCell, Cell destCell) {
        CellStyle srcStyle = srcCell.getCellStyle();
        CellStyle destStyle = dest.createCellStyle();

        // 复制基础样式
//        destStyle.cloneStyleFrom(srcStyle);

        // 获取源单元格的实际 RGB 颜色
        byte[] rgb = getRGBColor(srcStyle, src);

        // 在目标工作簿中创建匹配颜色
        short colorIndex = findOrCreateColor(dest, rgb);

        // 应用颜色到目标样式
        destStyle.setFillForegroundColor(colorIndex);
        destStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 复制其他样式属性...
        // [原有样式复制代码]

        destCell.setCellStyle(destStyle);
    }
}